/*
 * printer_bsp.c
 *  本文件打印机的一些基本操作，各种寄存器的读写，点火数据的写入，点火命令的下发，以及测试pattern都在里面
 *  Created on: Sep 25, 2023
 *      Author: Robin
 */

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include "ioctl.h"
#include "drv_spi.h"
#include "cmsis_os.h"
#include "printer_bsp.h"
#include "spicomm_task.h"
#include "dotmapping_task.h"
#include "spi2fpga_bsp.h"
#include "messages.h"
#include "printer.h"

#define MLOG_MODULE "printer_bsp"
#include "mlog.h"

void nozzle_grid_test_pattern_without_scanline(uint8_t rpt_cnt);
void flash_test_without_scanline(uint16_t flash_cnt);
// 测试条pattern奇数列
static const uint8_t fire_data_odd[22][SIZEOF_FIRE_DATA] = {
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}

};

// 测试条pattern偶数列
static const uint8_t fire_data_even[22][SIZEOF_FIRE_DATA] = {
    {0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}

};

void grid_test_pattern_gen(void)
{
    uint8_t i, j, k;
    uint8_t current_test_pattern[2][20] = {0};
    // 每行只有8个孔喷，22个循环，移位22次，便于定位问题
    uint8_t original_test_pattern22[22][20] = {
        {0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20},
        {0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10},
        {0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08},
        {0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04},
        {0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02},
        {0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01},
        {0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00},
        {0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00},
        {0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00},
        {0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00},
        {0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00},
        {0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00},
        {0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00},
        {0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00},
        {0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00},
        {0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00},
        {0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00},
        {0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00},
        {0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00},
        {0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00},
        {0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x80},
        {0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40}

    };

    uint8_t output_data[SIZEOF_FIRE_DATA] = {0x00};

    for (k = 0; k < 22; k++) {
        for (j = 0; j < 20; j++) {
            current_test_pattern[0][j] = (original_test_pattern22[k][j]); // 奇数列
            current_test_pattern[1][j] = 0;                               // 偶数列
        }

        // bmp2ASD_1c_mapping(&current_test_pattern[0][0], &output_data[0]);

        printf("奇数列ASD data %d is: ", k);
        for (i = 0; i < SIZEOF_FIRE_DATA; i++) {
            printf("0x%x,", output_data[i]);
            output_data[i] = 0;
        }
        printf("\n");
    }

    for (k = 0; k < 22; k++) {
        for (j = 0; j < 20; j++) {
            current_test_pattern[0][j] = 0;                               // 奇数列
            current_test_pattern[1][j] = (original_test_pattern22[k][j]); // 偶数列
        }

        // bmp2ASD_1c_mapping(&current_test_pattern[0][0], &output_data[0]);

        printf("偶数列ASD data %d is: ", k);
        for (i = 0; i < SIZEOF_FIRE_DATA; i++) {
            printf("0x%x,", output_data[i]);
            output_data[i] = 0;
        }
        printf("\n");
    }
}
/*******************************************************************************
 * Function Name  : allnozzle_grid_test_pattern
 * Description    : 用于做测试条打印：相邻22个喷孔，每次只有1个喷孔打印出墨，
 *									 喷射指定次后轮到下一个喷孔
 * Input          : uint8_t rpt_cnt:每个孔连续喷射多少次
 * Output         : 无
 * Return         : 无
 * Attention		 :
 *******************************************************************************/
void nozzle_grid_test_pattern(uint8_t rpt_cnt)
{
    uint8_t i;
    uint16_t used_buffer_size = 0;
    uint16_t old_used_buffer_size = 0;
    uint16_t fire_loop = 0;
    uint8_t fire_cnt = 0;

    uint8_t output_data[SIZEOF_FIRE_DATA] = {0x00};
    uint8_t allFF_test_pattern[SIZEOF_FIRE_DATA] = {0xFF};

    // 打印奇数列的数据
    for (fire_cnt = 0; fire_cnt < 22; fire_cnt++) {
        (void)SPI_WRITE_FIREDATA(&allFF_test_pattern[0]); // 每隔16次全喷一次

        for (i = 0; i < SIZEOF_FIRE_DATA; i++) {
            output_data[i] = fire_data_odd[fire_cnt][i];
        }

        fire_loop = 0;

        while (1) // 光栅触发未知，开始死循环
        {
            used_buffer_size = get_firefifo_used_buffer();
            if (used_buffer_size != old_used_buffer_size) {
                printf("Used buffer size is %d \n", used_buffer_size);
                old_used_buffer_size = used_buffer_size;
            }
            while (used_buffer_size < 1950) // 没写满之前持续写
            {
                SPI_WRITE_FIREDATA(&output_data[0]);
                used_buffer_size = get_firefifo_used_buffer();
                if (used_buffer_size != old_used_buffer_size) {
                    printf("Used buffer size is %d \n", used_buffer_size);
                    old_used_buffer_size = used_buffer_size;
                }
                fire_loop++;
                if (fire_loop >= rpt_cnt) {
                    break;
                } // 当前模式发了rpt_cnt次，需要更换pattern，跳出当前循环
            }
            // 写满了，光栅还没有触发，没有达到rpt_cnt次，死等
            // printf("Waiting Car Moving, fireloop = %d \n", fire_loop);
            if (fire_loop >= rpt_cnt) {
                break;
            } // 达到了100次，跳出死循环，开始下一次
        }
    }

    (void)SPI_WRITE_FIREDATA(&allFF_test_pattern[0]); // 每隔16次全喷一次
    printf("End of odd Nozzle Test!\n");
    // osDelay(1000);
    printf("After Fire, Used Buffer Size is %d \n", get_firefifo_used_buffer());

    // 打印偶数列的数据
    for (fire_cnt = 0; fire_cnt < 22; fire_cnt++) {
        // 准备好打印数据
        (void)SPI_WRITE_FIREDATA(&allFF_test_pattern[0]); // 每隔16次全喷一次

        for (i = 0; i < SIZEOF_FIRE_DATA; i++) {
            output_data[i] = fire_data_even[fire_cnt][i];
            // printf("%x ",output_data[i]);
        }
        // printf("\n");

        fire_loop = 0;

        while (1) // 光栅触发未知，开始死循环
        {
            used_buffer_size = get_firefifo_used_buffer();
            if (used_buffer_size != old_used_buffer_size) {
                printf("Used buffer size is %d \n", used_buffer_size);
                old_used_buffer_size = used_buffer_size;
            }
            while (used_buffer_size < 1950) // 没写满之前持续写
            {
                SPI_WRITE_FIREDATA(&output_data[0]);
                used_buffer_size = get_firefifo_used_buffer();
                if (used_buffer_size != old_used_buffer_size) {
                    printf("Used buffer size is %d \n", used_buffer_size);
                    old_used_buffer_size = used_buffer_size;
                }
                fire_loop++;
                if (fire_loop >= rpt_cnt) {
                    break;
                } // 当前模式发了100次，需要更换pattern，跳出当前循环
            }
            // 写满了，光栅还没有触发，没有达到rpt_cnt次，死等
            // printf("Waiting Car Moving, fireloop = %d \n", fire_loop);
            if (fire_loop >= rpt_cnt) {
                break;
            } // 达到了100次，跳出死循环，开始下一次
        }
    }
    (void)SPI_WRITE_FIREDATA(&allFF_test_pattern[0]); // 每隔16次全喷一次
    printf("End of even Nozzle Test!\n");
}

/*******************************************************************************
 * Function Name  : flash_test
 * Description    : 用于做光栅条驱动下的闪喷测试。光栅每移动一个单元，所有孔全喷一次
 * Input          : flash_cnt:闪喷次数
 * Output         : 无
 * Return         : 无
 * Attention		 : 此处有死循环，未完成次数前不退出循环
 *******************************************************************************/

void flash_test(uint16_t flash_cnt)
{
    uint8_t firedata[SIZEOF_FIRE_DATA] = {0xFF}; // 初始化点火数据，0xFF为全喷
    uint16_t used_buffer_size = 0;
    uint16_t old_used_buffer_size = 0;
    uint16_t fire_loop = 0;

    // 写点火数据到FPGA

    printf("Please move the Car to trigger the fire opeartion!\n");

    while (1) // 光栅触发未知，开始死循环
    {
        used_buffer_size = get_firefifo_used_buffer();
        if (used_buffer_size != old_used_buffer_size) {
            // printf("Before flash write1, used buffer size is %d \n", used_buffer_size);
            old_used_buffer_size = used_buffer_size;
        }

        while (used_buffer_size < 1950) // 没写满之前持续写
        {
            SPI_WRITE_FIREDATA(&firedata[0]);
            used_buffer_size = get_firefifo_used_buffer();
            if (used_buffer_size != old_used_buffer_size) {
                printf("used buffer size is %d \n", used_buffer_size);
                old_used_buffer_size = used_buffer_size;
            }

            fire_loop++;
            if (fire_loop >= flash_cnt) {
                break;
            } // 当前模式发了100次，需要更换pattern，跳出当前循环
        }
        // 写满了，光栅还没有触发，没有达到flash_cnt次，死等
        if (fire_loop >= flash_cnt) {
            break;
        } // 达到了100次，跳出死循环，开始下一次
    }
    printf("End of flash Test!\n");
    // osDelay(1000);
    printf("After Fire, Used Buffer Size is %d \n", get_firefifo_used_buffer());

    return;
}

/*******************************************************************************
 * Function Name  : SPI_WRITE_FIREDATA
 * Description    : MCU通过SPI给FPGA写入点火数据
 * Input          :
 *				*data				—— 写入数据的首字节指针，以字节为单位
 * Output         : 无//待补充错误信息
 * Return         : 同上
 * Attention		 : 数据长度为固定值，在SIZEOF_FIRE_DATA里面定义，CRC为false表示不需要CRC
 *                  打印数据有CRC错误，不做丢弃处理，继续使用
 *******************************************************************************/

int16_t SPI_WRITE_FIREDATA(uint8_t *data)
{
    FPGA_SPI_WRITE(ADD_REG_FIREDATA, SIZEOF_FIRE_DATA, data, true);

    return 0;
}

// 触发一次强制点火
void fpga_start_fire_once(void)
{
    uint8_t tx_data = 0xAA;
    // FPGA_SPI_WRITE(ADD_REG_FUNCTIONTEST, SIZEOF_REG_FUNCTIONTEST , 0xAA);
    FPGA_SPI_WRITE(ADD_REG_FUNCTIONTEST, SIZEOF_REG_FUNCTIONTEST, &tx_data, true);

    return;
}

/*******************************************************************************
 * Description    : 以下区域为打印机点火板各种基础寄存器的读函数
 * Input          : 空
 * Output         : 返回对应的功能寄存器的值
 * Return         : 同上
 ********************************************************************************/

// 读取点火FIFO的已经使用的空间
int16_t get_firefifo_used_buffer(void)
{
    if (SIZEOF_REG_BUFFERUSEDSIZE == 1) {
        return FPGA_read_byte(ADD_REG_BUFFERUSEDSIZE);
    } else {
        return FPGA_read_halfword(ADD_REG_BUFFERUSEDSIZE);
    }
}

// 读取点火FIFO的总空间
int16_t get_firefifo_buffer_total_size(void)
{
    if (SIZEOF_REG_BUFFERTOTALSIZE == 1) {
        return FPGA_read_byte(ADD_REG_BUFFERTOTALSIZE);
    } else {
        return FPGA_read_halfword(ADD_REG_BUFFERTOTALSIZE);
    }
}

// 读取当前小车位置
int16_t get_curr_position(void)
{
    if (SIZEOF_REG_CURPOSITON == 1) {
        return FPGA_read_byte(ADD_REG_CURPOSITON);
    } else {
        return FPGA_read_halfword(ADD_REG_CURPOSITON);
    }
}

// 读取当前的FPGA版本号
int16_t get_FPGA_version(void)
{
    if (SIZEOF_REG_BITSTREAMVER == 1) {
        return FPGA_read_byte(ADD_REG_BITSTREAMVER);
    } else {
        return FPGA_read_halfword(ADD_REG_BITSTREAMVER);
    }
}

// 读取当前的中断状态寄存器值
int16_t get_curr_intstatus(void)
{
    if (SIZEOF_REG_INTERRUPTSTATUS == 1) {
        return FPGA_read_byte(ADD_REG_INTERRUPTSTATUS);
    } else {
        return FPGA_read_halfword(ADD_REG_INTERRUPTSTATUS);
    }
}

// 头板上电时序控制
void fpga_fireboard_power_up(void)
{
    uint8_t in_data = 0x01;
    FPGA_SPI_WRITE(ADD_REG_PWRCTRL, SIZEOF_REG_PWRCTRL, &in_data, false);
    osDelay(1); // dalay 1ms

    in_data = 0x03;
    FPGA_SPI_WRITE(ADD_REG_PWRCTRL, SIZEOF_REG_PWRCTRL, &in_data, false);
    osDelay(1); // dalay 1ms

    in_data = 0x07;
    FPGA_SPI_WRITE(ADD_REG_PWRCTRL, SIZEOF_REG_PWRCTRL, &in_data, false);
    osDelay(1); // dalay 1ms

    in_data = 0x0F;
    FPGA_SPI_WRITE(ADD_REG_PWRCTRL, SIZEOF_REG_PWRCTRL, &in_data, false);
    return;
}

// 头板下电时序控制
void fpga_fireboard_power_down(void)
{
    uint8_t in_data = 0x07;
    FPGA_SPI_WRITE(ADD_REG_PWRCTRL, SIZEOF_REG_PWRCTRL, &in_data, false);
    osDelay(1); // dalay 1ms

    in_data = 0x03;
    FPGA_SPI_WRITE(ADD_REG_PWRCTRL, SIZEOF_REG_PWRCTRL, &in_data, false);
    osDelay(1); // dalay 1ms

    in_data = 0x01;
    FPGA_SPI_WRITE(ADD_REG_PWRCTRL, SIZEOF_REG_PWRCTRL, &in_data, false);
    osDelay(10); // dalay 1ms

    in_data = 0x00;
    FPGA_SPI_WRITE(ADD_REG_PWRCTRL, SIZEOF_REG_PWRCTRL, &in_data, false);
    return;
}

int16_t fpga_get_pwr_status(void)
{
    if (SIZEOF_REG_PWRCTRL == 1) {
        return FPGA_read_byte(ADD_REG_PWRCTRL);
    } else {
        return FPGA_read_halfword(ADD_REG_PWRCTRL);
    }
}
// 对FPGA进行软件复位FPGA，也可以拉低GPIO管脚实现更彻底的复位
void FPGA_sw_reset(void)
{
    uint8_t in_data = 0;
    FPGA_SPI_WRITE(ADD_REG_FPGA_SW_RST, SIZEOF_FPGA_SW_RST, &in_data, false);
    return;
}

void FPGA_Buffer_reset(void)
{
    uint8_t in_data = 0;
    FPGA_SPI_WRITE(ADD_REG_BUFFERRESET, SIZEOF_REG_BUFFERRESET, &in_data, false);
    return;
}
// 显示所有的寄存器值，供调试时调用
void FPGA_show_all_reg(void)
{
    uint8_t i;
    mlog_infoln("All FPGA Registers value is: ");
    for (i = 0; i < 64; i++) {
        printf("%2X ", FPGA_read_byte(ADD_REG_TEST + i));
    }
    mlog_infoln("\n");
}

void FPGA_read_test(void)
{
    int i = 0;
    uint8_t readbyte = 0;
    while (1) {
        readbyte = FPGA_read_byte(ADD_REG_BITSTREAMVER);
        if (0x02 == readbyte) {
            i++;
        } else {
            printf("spi read error! %d\n", readbyte);
        }

        if (i % 1000 == 0) {
            printf("spi read sucessfully %d times \n", i);
        }
    }
}

void FPGA_readwrite_test(void)
{
}

// 打印测试条的接口函数
int32_t drv_prn_testpattern(void)
{
    mlog_infoln("Now printe test pattern");
    // nozzle_grid_test_pattern_without_scanline(220);
    return drv_prn_odd_even_offset_test();
}

void drv_prn_flashtest(uint16_t cnt)
{
    mlog_infoln("Now start flash test %d times", cnt);
    flash_test_without_scanline(cnt);
}

int32_t drv_y_pattern_test(uint8_t pass_num) // y轴测试条
{
    size_t sent;
    uint8_t allwhite[DOT_NUM_1C] = {0};
    uint8_t allblack[DOT_NUM_1C] = {0};
    uint8_t firedata[DOT_NUM_1C];
    uint8_t i;
    uint8_t j;
    uint8_t k;

    memset(allwhite, 0xFF, DOT_NUM_1C); // 初始化点火数据，0xFF为全白
    memset(allblack, 0x00, DOT_NUM_1C); // 初始化点火数据，0x00为全喷
    if (pdPASS != xStreamBufferReset(g_image_streambuffer)) {
        mlog_errorln("stream buffer reset error");
        return;
    }

    for (j = 0; j < 200; j++) { // 清洗喷头
        sent = xStreamBufferSend(g_image_streambuffer, allblack, DOT_NUM_1C, portMAX_DELAY);
    }
    for (j = 0; j < 200; j++) { // 留白
        sent = xStreamBufferSend(g_image_streambuffer, allwhite, DOT_NUM_1C, portMAX_DELAY);
    }
    if (pass_num == 1) { // 喷出20条全黑的线
        mlog_infoln("y_pattern first %d", xStreamBufferSpacesAvailable(g_image_streambuffer));
        memset(firedata, 0x00, sizeof(firedata));
        for (i = 0; i < 32; i++) {
            sent = xStreamBufferSend(g_image_streambuffer, firedata, DOT_NUM_1C, portMAX_DELAY);
            if (i < 31) {
                for (j = 0; j < 50; j++) {
                    sent = xStreamBufferSend(g_image_streambuffer, allwhite, DOT_NUM_1C, portMAX_DELAY);
                }
            }
        }
    } else if (pass_num == 2) {
        for (j = 0; j < 39; j++) { // 留白
            sent = xStreamBufferSend(g_image_streambuffer, allwhite, DOT_NUM_1C, portMAX_DELAY);
        }
        mlog_infoln("y_pattern Second %d", xStreamBufferSpacesAvailable(g_image_streambuffer));
        for (i = 0; i < 8; i++) {
            memset(firedata, 0x00, sizeof(firedata));
            for (k = 0; k < 4; k++) {
                uint8_t result = ~(0xFF >> (2 * (k + 1)));
                printf("%02x ", result);
                if (i > 0) {
                    memset(firedata, 0xFF, i);
                    memset(firedata + sizeof(firedata) / 2, 0XFF, i);
                }
                memset(firedata + i, result, 1);
                memset(firedata + sizeof(firedata) / 2 + i, result, 1);

                sent = xStreamBufferSend(g_image_streambuffer, firedata, DOT_NUM_1C, portMAX_DELAY);
                for (j = 0; j < 50; j++) {
                    sent = xStreamBufferSend(g_image_streambuffer, allwhite, DOT_NUM_1C, portMAX_DELAY);
                }
            }
            printf("\n");

            for (uint8_t m = 0; m < 8; m++) {
                printf("%02x ", firedata[m]);
            }
            printf("\n");
        }

        // memset(firedata, 0xFF, 19 - i);
        // memset(firedata + 19, 0xFF, 19 - i);
        // sent = xStreamBufferSend(g_image_streambuffer, firedata, DOT_NUM_1C, portMAX_DELAY);
    }
    mlog_infoln("DOT streamBuffer send ok, now buffer available size is %d", xStreamBufferSpacesAvailable(g_image_streambuffer));
    return xStreamBufferBytesAvailable(g_image_streambuffer) / 38;
}

int32_t drv_prn_odd_even_offset_test() // x轴测试条
{
    size_t sent;
    uint8_t allwhite[DOT_NUM_1C] = {0};
    uint8_t allblack[DOT_NUM_1C] = {0};
    uint8_t firedata[DOT_NUM_1C];       // 双列奇半黑半白偶全黑
    uint8_t firedata0[DOT_NUM_1C_HALF]; // 单列全白
    uint8_t firedata1[DOT_NUM_1C_HALF]; // 单列半黑半白
    uint8_t firedata2[DOT_NUM_1C_HALF]; // 单列全黑
    uint8_t i;
    uint8_t j;

    memset(firedata, 0x00, sizeof(firedata));
    memset(firedata + DOT_NUM_1C_HALF / 2, 0xFF, DOT_NUM_1C_HALF / 2); // 初始化firedata

    memset(firedata0, 0xFF, sizeof(firedata0)); // 初始化firedata0

    memset(firedata1, 0x00, sizeof(firedata1) / 2);
    memset(firedata1 + sizeof(firedata1) / 2, 0xFF, sizeof(firedata1) / 2); // 初始化firedata1

    memset(firedata2, 0x00, sizeof(firedata2)); // 初始化firedata2

    memset(allwhite, 0xFF, DOT_NUM_1C); // 初始化点火数据，0xFF为全白
    memset(allblack, 0x00, DOT_NUM_1C); // 初始化点火数据，0x00为全喷

    mlog_infoln("available_before %d", xStreamBufferSpacesAvailable(g_image_streambuffer));

    // 初始化ASD_Streambuffer里面的数据
    if (pdPASS != xStreamBufferReset(g_image_streambuffer)) {
        mlog_errorln("stream buffer reset error");
        return;
    }
    for (j = 0; j < 200; j++) { // 清洗喷头
        sent = xStreamBufferSend(g_image_streambuffer, allblack, DOT_NUM_1C, portMAX_DELAY);
    }
    for (j = 0; j < 200; j++) { // 留白
        sent = xStreamBufferSend(g_image_streambuffer, allwhite, DOT_NUM_1C, portMAX_DELAY);
    }

    sent = xStreamBufferSend(g_image_streambuffer, allblack, DOT_NUM_1C, portMAX_DELAY); // 喷出两条全黑

    for (i = 0; i < 200; i++) { // 留白
        sent = xStreamBufferSend(g_image_streambuffer, allwhite, DOT_NUM_1C, portMAX_DELAY);
    }

    sent = xStreamBufferSend(g_image_streambuffer, firedata, DOT_NUM_1C, portMAX_DELAY); // 喷出一条半黑，一条全黑

    for (i = 0; i < 100; i++) { // 留白
        sent = xStreamBufferSend(g_image_streambuffer, allwhite, DOT_NUM_1C, portMAX_DELAY);
    }

    for (i = 1; i <= 20; i++) { // 循环打印间隔依次从1到20，第20行不打印全白间隔

        sent = xStreamBufferSend(g_image_streambuffer, firedata0, DOT_NUM_1C_HALF, portMAX_DELAY);
        sent = xStreamBufferSend(g_image_streambuffer, firedata2, DOT_NUM_1C_HALF, portMAX_DELAY); // 单列喷
        for (j = 0; j < i; j++) {
            sent = xStreamBufferSend(g_image_streambuffer, firedata0, DOT_NUM_1C_HALF, portMAX_DELAY);
            sent = xStreamBufferSend(g_image_streambuffer, firedata0, DOT_NUM_1C_HALF, portMAX_DELAY);
        }
        sent = xStreamBufferSend(g_image_streambuffer, firedata1, DOT_NUM_1C_HALF, portMAX_DELAY); // 有数据
        sent = xStreamBufferSend(g_image_streambuffer, firedata0, DOT_NUM_1C_HALF, portMAX_DELAY);
        if (i < 20) {
            for (j = 0; j < 100; j++) {
                sent = xStreamBufferSend(g_image_streambuffer, allwhite, DOT_NUM_1C, portMAX_DELAY);
            }
        }
    }
    mlog_infoln("DOT streamBuffer send ok, now buffer available size is %d", xStreamBufferSpacesAvailable(g_image_streambuffer));
    return xStreamBufferBytesAvailable(g_image_streambuffer) / 38;
}

// 复位MCU
void drv_mcu_sw_reset(void)
{
}

// 开机自检
void drv_prn_self_test(void)
{
    mlog_infoln("Start printer self test");
}

/*******************************************************************************
 * Function Name  : flash_test_without_scanline
 * Description    : 用于做光栅条驱动下的闪喷测试。光栅每移动一个单元，所有孔全喷一次
 * Input          : flash_cnt:闪喷次数
 * Output         : 无
 * Return         : 无
 * Attention		 : 此处有死循环，未完成次数前不退出循环
 *******************************************************************************/

void flash_test_without_scanline(uint16_t flash_cnt)
{
    uint8_t firedata[SIZEOF_FIRE_DATA] = {0};
    size_t image_data_send = flash_cnt * SIZEOF_FIRE_DATA;
    size_t available = 0;
    size_t sent = 0;
    uint16_t i;

    memset(firedata, 0xFF, SIZEOF_FIRE_DATA); // 初始化点火数据，0xFF为全喷

    // 初始化ASD_Streambuffer里面的数据
    if (pdPASS != xStreamBufferReset(g_dot_streambuffer)) {
        mlog_errorln("stream buffer reset error");
        return;
    }

    available = xStreamBufferSpacesAvailable(g_dot_streambuffer);
    mlog_infoln("dot stream available %u, %u , %u", available, image_data_send, flash_cnt);
    if (available >= image_data_send) {
        for (i = 0; i < flash_cnt; i++) {
            sent = xStreamBufferSend(g_dot_streambuffer, firedata, SIZEOF_FIRE_DATA, 100);
            if (sent != SIZEOF_FIRE_DATA) {
                mlog_errorln("stream buffer send error %u, %u", i, sent);
            }
        }
    }
    mlog_infoln("ASD streamBuffer send ok, now buffer available size is%u", xStreamBufferSpacesAvailable(g_dot_streambuffer));
    return;
}

/*******************************************************************************
 * Function Name  : allnozzle_grid_test_pattern_without_scanline
 * Description    : 用于做测试条打印：相邻22个喷孔，每次只有1个喷孔打印出墨，
 *									 喷射指定次后轮到下一个喷孔
 * Input          : uint8_t rpt_cnt:每个孔连续喷射多少次
 * Output         : 无
 * Return         : 无
 * Attention		 :
 *******************************************************************************/
void nozzle_grid_test_pattern_without_scanline(uint8_t rpt_cnt)
{
    uint8_t i;
    uint8_t fire_cnt = 0;

    uint8_t output_data[SIZEOF_FIRE_DATA] = {0x00};
    uint8_t allFF_test_pattern[SIZEOF_FIRE_DATA] = {0};
    // uint8_t all00_pattern[SIZEOF_FIRE_DATA] = {0};
    // uint8_t test_data[SIZEOF_FIRE_DATA] = {
    //     0xf, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    //     0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    //     0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    //     0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    //     0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0

    // };
    size_t available = 0;
    size_t sent = 0;

    // 初始化ASD_Streambuffer里面的数据
    if (pdPASS != xStreamBufferReset(g_dot_streambuffer)) {
        mlog_errorln("stream buffer reset error");
        return;
    }

    memset(allFF_test_pattern, 0xFF, SIZEOF_FIRE_DATA); // 初始化点火数据，0xFF为全喷

    // memset(all00_pattern, 0x00, SIZEOF_FIRE_DATA);

    available = xStreamBufferSpacesAvailable(g_dot_streambuffer);
    mlog_infoln("dot stream available %u", available);

    for (fire_cnt = 0; fire_cnt < 30; fire_cnt++) {
        sent = xStreamBufferSend(g_dot_streambuffer, allFF_test_pattern, SIZEOF_FIRE_DATA, 100);
    }

    // 填充奇数列的数据
    for (fire_cnt = 0; fire_cnt < 22; fire_cnt++) {
        sent = xStreamBufferSend(g_dot_streambuffer, allFF_test_pattern, SIZEOF_FIRE_DATA, 100); // 每隔16次全喷一次
        if (sent != SIZEOF_FIRE_DATA) {
            mlog_errorln("stream buffer send error");
        }
        // for (fire_cnt = 0; fire_cnt < ODD_EVEV_OFFSET; fire_cnt++) {
        //     sent = xStreamBufferSend(g_dot_streambuffer, all00_pattern, SIZEOF_FIRE_DATA, 100); // 不喷
        //     if (sent != SIZEOF_FIRE_DATA) {
        //         mlog_errorln("stream buffer send error");
        //     }
        // }
        memcpy(output_data, fire_data_odd[fire_cnt], SIZEOF_FIRE_DATA);

        for (i = 0; i < rpt_cnt; i++) {
            sent = xStreamBufferSend(g_dot_streambuffer, output_data, SIZEOF_FIRE_DATA, 100);
            if (sent != SIZEOF_FIRE_DATA) {
                mlog_errorln("stream buffer send error");
                mlog_infoln("dot stream available %u", xStreamBufferSpacesAvailable(g_dot_streambuffer));
            }
        }
    }

    sent = xStreamBufferSend(g_dot_streambuffer, allFF_test_pattern, SIZEOF_FIRE_DATA, 100); // 每隔16次全喷一次
    if (sent != SIZEOF_FIRE_DATA) {
        mlog_errorln("stream buffer send error");
    }

    mlog_infoln("Odd Nozzle pattern create OK");

    for (fire_cnt = 0; fire_cnt < 30; fire_cnt++) {
        sent = xStreamBufferSend(g_dot_streambuffer, allFF_test_pattern, SIZEOF_FIRE_DATA, 100);
    }

    // 填充偶数列的数据
    for (fire_cnt = 0; fire_cnt < 22; fire_cnt++) {
        sent = xStreamBufferSend(g_dot_streambuffer, allFF_test_pattern, SIZEOF_FIRE_DATA, 100); // 每隔16次全喷一次
        if (sent != SIZEOF_FIRE_DATA) {
            mlog_errorln("stream buffer send error");
        }

        memcpy(output_data, fire_data_odd[fire_cnt], SIZEOF_FIRE_DATA);

        for (i = 0; i < rpt_cnt; i++) {
            sent = xStreamBufferSend(g_dot_streambuffer, output_data, SIZEOF_FIRE_DATA, 100);
            if (sent != SIZEOF_FIRE_DATA) {
                mlog_errorln("stream buffer send error");
            }
        }
    }

    sent = xStreamBufferSend(g_dot_streambuffer, allFF_test_pattern, SIZEOF_FIRE_DATA, 100); // 每隔16次全喷一次
    if (sent != SIZEOF_FIRE_DATA) {
        mlog_errorln("stream buffer send error");
    }

    mlog_infoln("Even Nozzle pattern create OK");

    available = xStreamBufferSpacesAvailable(g_dot_streambuffer);
    mlog_infoln("dot stream available %u", available);
    // for(int j = 0 ; j < 512000; j++)
    // {
    // 	if (j % 75 == 0)
    // 	{
    // 		printf("\n");
    // 	}

    // 	printf("%02X",s_dot_streambuffer_storage[j]);

    // }
}
